package cn.getech.data.development.utils.sap;

import com.alibaba.fastjson.JSON;
import com.sap.conn.jco.*;
import com.sap.conn.jco.rt.DefaultTable;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * @author of ZWZ
 * @TODO
 * @date 2019-09-25 10:34
 **/

public class AllJCOTest {

    public static void main(String[] args) {
        try {
            String   i1="张三";
            String s = InitializeDataByName(i1);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }



//    public static void accessSAPStructure() throws JCoException {
//        //初始化 ABAP_AS
//        new ConnectJCO().data2SAP();
//        JCoDestination destination = JCoDestinationManager
//                .getDestination("ABAP_AS");
//        JCoFunction function = destination.getRepository().getFunction(
//                "RFC_SYSTEM_INFO");//从对象仓库中获取 RFM 函数
//        if (function == null)
//            throw new RuntimeException(
//                    "RFC_SYSTEM_INFO not found in SAP.");
//        try {
//            function.execute(destination);
//        } catch (AbapException e) {
//            System.out.println(e.toString());
//            return ;
//        }
//        JCoStructure exportStructure = function.getExportParameterList()
//                .getStructure("RFCSI_EXPORT");
//        System.out.println("System info for "
//                + destination.getAttributes().getSystemID() + ":\n");
//        for (int i = 0; i < exportStructure.getMetaData().getFieldCount(); i++) {
//            System.out.println(exportStructure.getMetaData().getName(i) + ":\t"
//                    + exportStructure.getString(i));
//        }
//        System.out.println();
//        // JCo still supports the JCoFields, but direct access via getXX is more
//        // efficient as field iterator  也可以使用下面的方式来遍历
//        System.out.println("The same using field iterator: \nSystem info for "
//                + destination.getAttributes().getSystemID() + ":\n");
//        for (JCoField field : exportStructure) {
//            System.out.println(field.getName() + ":\t" + field.getString());
//        }
//        System.out.println();
//        //*********也可直接通过结构中的字段名或字段所在的索引位置来读取某个字段的值
//        System.out.println("RFCPROTO:\t"+exportStructure.getString(0));
//        System.out.println("RFCPROTO:\t"+exportStructure.getString("RFCPROTO"));
//    }
//
//    public static JSONObject selectStatuData(String name, String zyear, String month, String sta) throws JCoException {
//
//
//        JSONArray array2 = new JSONArray();
//        JSONObject jo = new JSONObject();
//        JSONObject jj = new JSONObject();
//        MyDestinationDataProvider myProvider = new ConnectJCO().data2SAP();
//        JCoDestination dest = JCoDestinationManager.getDestination("ABAP_AS");
//        dest.ping();
//
//        JCoFunction function = dest.getRepository().getFunction("ZGBXT_GET_STU");
//        function.getImportParameterList().setValue("IP_USERID", name);
//        function.getImportParameterList().setValue("IP_YEAR", zyear);//年
//        function.getImportParameterList().setValue("IP_MONTH", month);//月
//        function.getImportParameterList().setValue("IP_STATU", sta);//月
//        function.execute(dest);
//
//        String CODE1 = function.getExportParameterList().getString("EP_CODE");
//        String MESS1 = function.getExportParameterList().getString("EP_MESS");
//
//        try {
//
//            if (!CODE1.equals("")) {
//                jo.put("CODE", CODE1);
//                jo.put("MESS", MESS1);
//            }
//
//            JCoTable statu = function.getTableParameterList().getTable("ET_STU"); //公司代码
//            for (int j = 0; j < statu.getNumRows(); j++) {
//                statu.setRow(j);
//                for (int k = 0; k < statu.getMetaData().getFieldCount(); k++) {
//                    jj.put(statu.getMetaData().getName(k), statu.getString(k));
//                }
//                JSONObject jj1 = new JSONObject(jj.toString());
//                array2.put(jj1);
//                //                ENTITY.nextRow();
//            }
//            jo.put("UDSTATU", array2);
//
//        } catch (Exception e) {
//            throw new RuntimeException();
//        }
//        return jo;
//    }
//
//
//    public static List<Map<String, Object>> InitDataCTSData(Map<String, Object> map, String lua) throws JCoException {
//        JCoDestination dest = JCoDestinationManager.getDestination("ABAP_AS");
//        Map<String, Object> m = new HashMap<String, Object>();
//        List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
//        dest.ping();
//        JCoFunction function = dest.getRepository().getFunction("ZRFC_HR_INITIALIZE_DATA");
//        //            function.getImportParameterList().setValue("IP_UNAME", "admin");
//        function.getImportParameterList().setValue("IP_FLAG", "2");//调用顺序
//        function.getImportParameterList().setValue("IP_ENTITY", map.get("accountingCompany"));//公司代码
//        function.getImportParameterList().setValue("IP_GJAHR", map.get("accountingYear"));//会计年度
//        function.getImportParameterList().setValue("IP_POPER", map.get("accountingMonth"));//会计期间
//        function.getImportParameterList().setValue("IP_RPTCURRENCY", map.get("accountingCurrency"));//报表币种
//        //            function.getImportParameterList().setValue("IP_SCOPE", map.get(""));//合并组
//        function.getImportParameterList().setValue("IP_ZMODE", map.get("accountingModelName"));//模型
//        function.getImportParameterList().setValue("IP_LANGU", lua);//语言
//        function.execute(dest);
//        Object EP_ZSTATE = function.getExportParameterList().getValue("EP_ZSTATE");//状态
//        Object EP_BPCSTATUS = function.getExportParameterList().getValue("EP_BPCSTATUS");//BPC状态
//        Object VERSION = function.getExportParameterList().getValue("EP_VERSION");//版本
//        //            Date ZGXRQ = function.getExportParameterList().getDate("EP_ZGXRQ");//更新日期
//        Object ZGXRQ = function.getExportParameterList().getValue("EP_ZGXRQ");//更新日期
//        Object CODE = function.getExportParameterList().getValue("EP_CODE");//返回标识
//        Object MESS = function.getExportParameterList().getValue("EP_MESS");//返回信息
//
//
//        m.put("EP_BPCSTATUS", EP_BPCSTATUS);
//        m.put("EP_ZSTATE", EP_ZSTATE);
//        m.put("EP_VERSION", VERSION);
//        m.put("EP_ZGXRQ", ZGXRQ);
//        if (ZGXRQ == null || ZGXRQ.toString().equals("") || VERSION.equals("") || VERSION == null) {
//            m.put("EP_CODE", CODE);
//            m.put("EP_MESS", MESS);
//        }
//        list.add(m);
//        return list;
//    }
//
//
//    public static JSONObject InitializeData(Date date1, Date date, String string, String num) throws Exception {
//
//        JSONArray array = new JSONArray();
//        JSONArray array1 = new JSONArray();
//        JSONArray array2 = new JSONArray();
//        JSONObject jo = new JSONObject();
//        JSONObject jt = new JSONObject();
//        JSONObject jn = new JSONObject();
//        JSONObject jj = new JSONObject();
//        MyDestinationDataProvider myProvider = new ConnectJCO().data2SAP();
//        JCoDestination dest = JCoDestinationManager.getDestination("ABAP_AS");
//        dest.ping();
//
//        JCoFunction function = dest.getRepository().getFunction("ZGBXT_GET_STU");
//
//
//
//        //测试代码
//        //一级参数
//        JCoParameterList importParameterList = function.getImportParameterList();
//        importParameterList.setValue("I_BEGDA", date1);
//        importParameterList.setValue("I_ENDDA", date);//调用顺序
//        importParameterList.setValue("I_MODE", string);//语言
//        // 遍历全部得到的table并处理
//        for (JCoField field : function.getTableParameterList()) {
//            // 按照需求可以整理出一条一条的数据以便插入数据库
//            JCoTable responseTable = field.getTable();
//            //二级参数
//            responseTable.appendRow();
//            responseTable.setValue("Z_ORG_ID",num);
//        }
//
//        System.out.println(function);
//        System.out.println(dest);
//        function.execute(dest);
//
//        JCoTable jCoTables = function.getTableParameterList().getTable("O_STRUC_INFO");
//
//
////        JCoParameterList importParameterList = function.getImportParameterList();
////        importParameterList.setValue("I_BEGDA", date1);
////        importParameterList.setValue("I_ENDDA", date);//调用顺序
////        importParameterList.setValue("I_MODE", string);//语言
//////        Object it_object = importParameterList.getValue("IT_OBJECT");
//////        String name = it_object.getClass().getName();
//////        System.out.println(name);
//////        importParameterList.setValue("OBJECT", num);//语言
////        importParameterList.setValue("IT_OBJECT", num);//语言
////        function.execute(dest);
//
//        Date Z_DATE = function.getExportParameterList().getDate("Z_DATE");//返回EP集团
//        String Z_OTYPE = function.getExportParameterList().getString("Z_OTYPE");//返回EP应用程序集标识
//        int Z_ORG_ID = function.getExportParameterList().getInt("Z_ORG_ID");
//        String Z_ORG_SHORT = function.getExportParameterList().getString("Z_ORG_SHORT");
//        String Z_ORG_TEXT = function.getExportParameterList().getString("Z_ORG_TEXT");
//        String Z_QUFEN = function.getExportParameterList().getString("Z_QUFEN");
//        String Z_QUFEN_NAME = function.getExportParameterList().getString("Z_QUFEN_NAME");
//        String Z_UPOTYPE = function.getExportParameterList().getString("Z_UPOTYPE");
//        int Z_UPORG_ID = function.getExportParameterList().getInt("Z_UPORG_ID");
//        String Z_UPORG_TEXT = function.getExportParameterList().getString("Z_UPORG_TEXT");
//        String ZFLAG = function.getExportParameterList().getString("ZFLAG");
//
//        jo.put("Z_DATE", Z_DATE);
//        jo.put("Z_OTYPE", Z_OTYPE);
//        jo.put("Z_ORG_ID", Z_ORG_ID);
//        jo.put("Z_ORG_SHORT", Z_ORG_SHORT);
//        jo.put("Z_ORG_TEXT", Z_ORG_TEXT);
//        jo.put("Z_QUFEN", Z_QUFEN);
//        jo.put("Z_QUFEN_NAME", Z_QUFEN_NAME);
//        jo.put("Z_UPOTYPE", Z_UPOTYPE);
//        jo.put("Z_UPORG_ID", Z_UPORG_ID);
//        jo.put("Z_UPORG_TEXT", Z_UPORG_TEXT);
//        jo.put("ZFLAG", ZFLAG);
//
//
//        return jo;
//    }




    private static String InitializeDataByName(String i1) throws JCoException {
        String resJson = "";
        try {
            // 测试连接方式一
            JCoDestination dest = SAPConnUtils.connect1();
            //方式二
//          new ConnectJCO().data2SAP();
//          JCoDestination dest = JCoDestinationManager.getDestination("ABAP_AS");

            dest.ping();

            //测试代码
            // 遍历全部得到的table并处理
//            JCoFunction function = dest.getRepository().getFunction("z05_get_stu".toUpperCase());
            JCoFunction function = dest.getRepository().getFunction("z05_get_pernr".toUpperCase());
//            JCoFunction function = dest.getRepository().getFunction("Z05_GET_PERNR_IMG".toUpperCase());
//            System.out.println(function.toXML());

            //无输入表名！！！！！！！！！！！！！！！！！
            JCoParameterList importP = function.getImportParameterList();
            //人员信息读取s
//            importP.setValue("PIVZBEGDA","");
//            importP.setValue("PIVZENDDA","");
            importP.setValue("I_MODE","1");
            importP.setValue("I_FRM_ROW",150000);
            importP.setValue("I_TO_ROW",151000);
//            importP.setValue("PIVZPERNR","11095456");
//            importP.setValue("WERKS","");



            //组织架构读取
//            importP.setValue("I_BEGDA","19700101");
//            importP.setValue("I_ENDDA","20191119");
//            importP.setValue("I_MODE","1");
//            importP.setValue("IT_OBJECT","");
            JCoParameterFieldIterator parameterFieldIterator1 = importP.getParameterFieldIterator();
            while(parameterFieldIterator1.hasNextField()){
                System.out.println("输入"+parameterFieldIterator1.nextField().getName());
            }

            //有输入表名  ！！！！！！！！！！！！！！！！！！！！！
//            for (JCoField field : function.getTableParameterList()) {
//                 //按照需求可以整理出一条一条的数据以便插入数据库
//                JCoTable responseTable = field.getTable();
//                //二级参数
//                responseTable.appendRow();
//                responseTable.setValue("I_BEGDA","20191001");
//                responseTable.setValue("I_ENDDA","20191031");
//                responseTable.setValue("I_MODE","1");
//            }


            //组织架构读取
//            JCoParameterList export = function.getTableParameterList();
//            JCoFieldIterator parameterFieldIterator = export.getFieldIterator();
//            while(parameterFieldIterator.hasNextField()){
//                System.out.println("输出"+parameterFieldIterator.nextField().getName());
//            }

//            //人员信息获取
//            JCoParameterList export2 = function.getExportParameterList();
//            JCoFieldIterator parameterFieldIterator2 = export2.getFieldIterator();
//            while(parameterFieldIterator2.hasNextField()){
//                System.out.println("输出"+parameterFieldIterator2.nextField().getName());
//            }

            JCoParameterList tableParameterList = function.getTableParameterList();
            JCoTable jCoTables = null;
            if(null != tableParameterList){//没有表类型的参数，//组织架构读取
                jCoTables = function.getTableParameterList().getTable("O_STRUC_INFO");
            }else{
                jCoTables = function.getExportParameterList().getTable("ET_PERNR");//人员信息获取
            }
            function.execute(dest);


             List<Map<String,Object>> resData = new ArrayList<>();
            int z = 0;
            int o = 0;
            //校验是否是两级结构
            if(checkIsDouble(jCoTables)){
                if(null != jCoTables){
                    for (int i = 0; i < jCoTables.getNumRows(); i++) {
                        jCoTables.setRow(i);
                        Map<String,Object> newMap = new HashMap<>();//最终map
                        for(int k = 0; k < jCoTables.getMetaData().getFieldCount(); k++)
                        {
                            String presentTableName = jCoTables.getMetaData().getName(k);

                            //构建hive表结构的map，list中存放的是每个T0001下的字段名
                            Map<String,List<String>> tableNameMap = new HashMap<>();
                            //构建插入hive表的数据
                            Map<String,List<List<String>>> tableValue = new HashMap<>();
                            Map<String,Object> currentRow = new HashMap<>();//最后一级map
//                            System.out.println("二级字段名字是================================================================"+jCoTables.getMetaData().getName(k));
                            Object table=null;
                            try{
                                table = jCoTables.getTable(jCoTables.getMetaData().getName(k));
                            }catch (Exception ex){
                            }

                            //下级还有字段
                            if(null != table){
                                if("T0002".equalsIgnoreCase(jCoTables.getMetaData().getName(k))){
                                    List<Map<String,String>> currentZiDuan1 = new ArrayList<>();
                                    System.out.println(presentTableName);
                                    DefaultTable defaultTable = (DefaultTable)jCoTables.getValue(k);
                                    //最小的字段名list
                                    List<String> lastTableName = new ArrayList<>();
                                    List<List<String>> lastTableValue = new ArrayList<>();
                                    if(0 == defaultTable.getNumRows()){
                                        List<String> rowValue = new ArrayList<>();
                                        Map<String,String> currentRow1 = new HashMap<>();
                                        currentZiDuan1.add(currentRow1);
                                        newMap.put(jCoTables.getMetaData().getName(k),currentZiDuan1);
                                        lastTableValue.add(rowValue);
                                        tableNameMap.put(jCoTables.getMetaData().getName(k),lastTableName);
                                        tableValue.put(jCoTables.getMetaData().getName(k),lastTableValue);
                                    }else{
                                        for (int j = 0; j < defaultTable.getNumRows(); j++) {
                                            defaultTable.setRow(j);
                                            //获取每个最底层字段的值
                                            Map<String,String> currentRow1 = new HashMap<>();
                                            List<String> rowValue = new ArrayList<>();
                                            for (int l = 0; l < defaultTable.getMetaData().getFieldCount(); l++) {
                                                if(l == 0){
                                                    lastTableName.add(defaultTable.getMetaData().getName(l));
                                                }
//                                            if(defaultTable.getValue(l).toString().equals("O")){
//                                                z++;
//                                            }
//                                                String string = defaultTable.getValue(l).toString();
//                                                System.out.print(string);
//                                                System.out.print("(数据位置：" + j + "," + l + ")");
//                                                System.out.print("    ");

                                                //判断是否是Date格式，转化日期格式
                                                defaultTable.getMetaData().getType(l);
//                                                if(defaultTable.getValue(l) instanceof Date){
//                                                    DateFormat dFormat = new SimpleDateFormat("yyyy-MM-dd"); //HH表示24小时制
//                                                    String formatDate = dFormat.format(defaultTable.getValue(l));
//                                                    currentRow1.put(defaultTable.getMetaData().getName(l),formatDate);
//                                                    rowValue.add(formatDate);
//                                                }else{
                                                    if(defaultTable.getValue(l) != null ){
                                                        currentRow1.put(defaultTable.getMetaData().getName(l),defaultTable.getValue(l).toString());
                                                        rowValue.add(defaultTable.getValue(l).toString());

                                                    }else{
                                                        currentRow1.put(defaultTable.getMetaData().getName(l),"");
                                                        rowValue.add("");
                                                    }
//                                                }
                                                lastTableValue.add(rowValue);
                                            }

                                            System.out.println("  ");

                                            currentZiDuan1.add(currentRow1);
                                        }
                                        tableNameMap.put(jCoTables.getMetaData().getName(k),lastTableName);
                                        tableValue.put(jCoTables.getMetaData().getName(k),lastTableValue);
                                        newMap.put(jCoTables.getMetaData().getName(k),currentZiDuan1);
                                    }
                                }
                            }else{//本身是最后一级
                                if(jCoTables.getValue(k) instanceof Date){
                                    DateFormat dFormat = new SimpleDateFormat("yyyy-MM-dd"); //HH表示24小时制
                                    String formatDate = dFormat.format(jCoTables.getValue(k));
                                    currentRow.put(jCoTables.getMetaData().getName(k),formatDate);
                                }else{
                                    if(jCoTables.getValue(k) != null ){
                                        if("E_END".equalsIgnoreCase(jCoTables.getMetaData().getName(k))){
                                            if("X".equals(jCoTables.getValue(k))){
                                                System.out.println("已经到最后一条数据");
                                            }else{
                                                System.out.println("E_END值为============="+jCoTables.getValue(k)+"++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
                                            }
                                        }
                                        currentRow.put(jCoTables.getMetaData().getName(k),jCoTables.getValue(k).toString());
                                    }else{
                                        currentRow.put(jCoTables.getMetaData().getName(k),"");
                                    }
                                }
                                resData.add(currentRow);
                            }
                        }
                        if(null != newMap){
                            resData.add(newMap);
                        }
                    }
                }
            }else{
                if(null != jCoTables) {
                    System.out.println(jCoTables.getNumRows());
                    for (int i = 0; i < jCoTables.getNumRows(); i++) {
                        jCoTables.setRow(i);
                        Map<String,Object> currentRow = new HashMap<>();//最后一级map
                        for (int k = 0; k < jCoTables.getMetaData().getFieldCount(); k++) {
                            if(jCoTables.getMetaData().getName(k).equals("Z_OTYPE")){
                                o++;
                                if(jCoTables.getValue(k).toString().equals("O")){
                                    z++;
                                }
                            }
                            String formatDate = null;
//                            if(jCoTables.getValue(k) instanceof Date){
//                                DateFormat dFormat = new SimpleDateFormat("yyyy-MM-dd"); //HH表示24小时制
//                                formatDate = dFormat.format(jCoTables.getValue(k));
//                                currentRow.put(jCoTables.getMetaData().getName(k),formatDate);
//                            }else{
                            if(null == jCoTables.getValue(k) || "".equals(jCoTables.getValue(k))){
                                currentRow.put(jCoTables.getMetaData().getName(k),"null");
                            }else{
                                currentRow.put(jCoTables.getMetaData().getName(k),jCoTables.getValue(k).toString());
                            }
//                            }
                        }
                        resData.add(currentRow);
                    }
                }
            }
            System.out.println("++++++++++++++++++++++"+o);
//            System.out.println("======================"+z);
            System.out.println("数据量为"+resData.size());
            resJson = JSON.toJSONString(resData);
            System.out.println(resJson);
            return resJson;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return resJson;
    }


    //校验是否是两级嵌套结构
    public static Boolean checkIsDouble(JCoTable jCoTables){
        if(null != jCoTables) {
//            for (int i = 0; i < jCoTables.getNumRows(); i++) {
//                jCoTables.setRow(i);
                for (int k = 0; k < jCoTables.getMetaData().getFieldCount(); k++) {
                    Object table=null;
                    try{
                        table = jCoTables.getTable(jCoTables.getMetaData().getName(k));
                    }catch (Exception ex){
                    }
                    if(null != table){
                        return true;
                    }
                }
//            }
        }
        return false;
    }

    public void test() throws JCoException {

    }


}
